import axios from 'axios'

// 获取基础URL - 支持环境变量或默认值
const getBaseURL = () => {
  // 优先使用环境变量
  if (import.meta.env.VITE_API_BASE_URL) {
    return import.meta.env.VITE_API_BASE_URL
  }
  // 默认值
  return 'http://localhost:8000'
}

// 创建axios实例
const api = axios.create({
  baseURL: getBaseURL(),
  timeout: 60000, // 增加到60秒，因为AI调用和知识库检索可能需要更长时间
  headers: {
    'Content-Type': 'application/json'
  },
  // 确保跨域请求携带凭证
  withCredentials: false  // 如果后端CORS配置了allow_credentials，可以设为true
})

// 创建QA专用的axios实例，使用更长的超时时间
const qaApi = axios.create({
  baseURL: getBaseURL(),
  timeout: 120000, // QA API使用120秒超时，因为AI调用和知识库检索可能需要更长时间
  headers: {
    'Content-Type': 'application/json'
  },
  withCredentials: false
})

// 为QA API添加请求拦截器（添加token）
qaApi.interceptors.request.use(
  config => {
    if (!config.baseURL) {
      config.baseURL = getBaseURL()
    }
    
    const token = localStorage.getItem('token')
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

// 为QA API添加响应拦截器
qaApi.interceptors.response.use(
  response => {
    return response.data
  },
  error => {
    console.error('QA API请求错误:', {
      message: error.message,
      code: error.code,
      config: {
        url: error.config?.url,
        baseURL: error.config?.baseURL,
        method: error.config?.method
      },
      response: error.response ? {
        status: error.response.status,
        statusText: error.response.statusText,
        data: error.response.data
      } : null
    })
    
    // 超时错误特殊处理
    if (error.code === 'ECONNABORTED' || error.message.includes('timeout')) {
      console.error('⏱️ 请求超时:', {
        '问题': 'API请求超过120秒仍未完成',
        '可能原因': [
          'AI模型响应时间过长',
          '知识库检索耗时过长',
          '网络连接不稳定',
          '后端服务负载过高'
        ],
        '建议': [
          '检查网络连接',
          '检查后端服务状态',
          '尝试减少知识库检索数量',
          '稍后重试'
        ]
      })
    }
    
    if (error.response?.status === 401) {
      localStorage.removeItem('token')
      localStorage.removeItem('userInfo')
      window.location.href = '/login'
    }
    
    return Promise.reject(error)
  }
)

// 请求拦截器 - 添加token
api.interceptors.request.use(
  config => {
    // 确保baseURL正确
    if (!config.baseURL) {
      config.baseURL = getBaseURL()
    }
    
    // 确保URL是完整的
    if (config.url && !config.url.startsWith('http')) {
      // 如果baseURL丢失，重新设置
      if (!config.baseURL || config.baseURL === ':8000') {
        console.warn('检测到baseURL异常，重新设置:', getBaseURL())
        config.baseURL = getBaseURL()
      }
    }
    
    const token = localStorage.getItem('token')
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    
    // 调试日志
    if (import.meta.env.DEV) {
      console.log('请求配置:', {
        method: config.method,
        url: config.url,
        baseURL: config.baseURL,
        fullURL: `${config.baseURL}${config.url}`
      })
    }
    
    return config
  },
  error => {
    console.error('请求拦截器错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器 - 处理错误
api.interceptors.response.use(
  response => {
    return response.data
  },
  error => {
    // 详细的错误日志
    console.error('API请求错误:', {
      message: error.message,
      code: error.code,
      config: {
        url: error.config?.url,
        baseURL: error.config?.baseURL,
        method: error.config?.method
      },
      response: error.response ? {
        status: error.response.status,
        statusText: error.response.statusText,
        data: error.response.data
      } : null,
      request: error.request
    })
    
    // 网络错误处理
    if (error.code === 'ERR_NETWORK' || error.message === 'Network Error' || error.code === 'ERR_FAILED') {
      const errorInfo = {
        '后端服务未启动': '请确保后端服务运行在 http://localhost:8000',
        'CORS问题': '检查后端CORS配置（已修复，请重启后端服务）',
        '防火墙拦截': '检查防火墙设置',
        '请求URL': `${error.config?.baseURL || getBaseURL()}${error.config?.url || ''}`,
        '错误代码': error.code || 'UNKNOWN'
      }
      
      console.error('❌ 网络错误 - 请检查以下问题:', errorInfo)
      console.log('💡 解决方案:')
      console.log('1. 检查后端服务是否运行: 访问 http://localhost:8000/health')
      console.log('2. 如果后端未运行，请在 House(1) 目录下运行: python main.py 或 uvicorn main:app --reload')
      console.log('3. 确保后端服务监听在 0.0.0.0:8000 端口')
      
      // 如果baseURL异常，尝试重新请求
      if (error.config && (!error.config.baseURL || error.config.baseURL.includes(':8000') && !error.config.baseURL.startsWith('http'))) {
        error.config.baseURL = getBaseURL()
        console.log('尝试修复baseURL后重新请求...')
        // 注意：这里不自动重试，避免无限循环
      }
    }
    
    // CORS错误处理
    if (error.code === 'ERR_NETWORK' && error.message.includes('CORS')) {
      console.error('🚫 CORS错误:', {
        '问题': '后端响应缺少 CORS 头',
        '已修复': '已在后端添加全局异常处理，请重启后端服务',
        '后端文件': 'House(1)/main.py',
        '检查': '确保后端 main.py 中的 CORS 中间件已配置'
      })
    }
    
    if (error.response?.status === 401) {
      // token过期，清除登录状态
      localStorage.removeItem('token')
      localStorage.removeItem('userInfo')
      window.location.href = '/login'
    }
    
    // 确保错误对象包含完整的response信息
    return Promise.reject(error)
  }
)

// 认证相关API
export const authAPI = {
  // 登录
  login: (data) => api.post('/auth', data),
  // 注册
  register: (data) => api.post('/auth/register', data),
  // 获取当前用户信息
  getCurrentUser: () => api.get('/auth/me'),
  // 更新用户信息
  updateUserInfo: (data) => api.put('/auth/me', data),
  // 修改密码
  changePassword: (data) => api.post('/auth/change-password', data),
  // 退出登录
  logout: () => api.post('/auth/logout'),
  // 获取钉钉登录URL
  getDingTalkLoginUrl: () => api.get('/auth/dingtalk/login-url'),
  // 钉钉登录回调
  dingTalkCallback: (data) => api.post('/auth/dingtalk/callback', data),
  // 获取实名认证详情
  getVerificationDetail: () => api.get('/auth/verification-detail')
}

// 七牛云相关API
export const qiniuAPI = {
  // 获取七牛云上传token
  getUploadToken: () => api.get('/qiniu/token'),
  // 根据key获取七牛云URL
  getUrl: (data) => api.post('/qiniu/url', data)
}

// 个人中心相关API
export const profileAPI = {
  // 实名认证
  verifyIdCard: (data) => api.post('/auth/verify-idcard', data),
  // 获取系统消息
  getSystemMessages: () => api.get('/auth/messages')
}

// 旅游平台相关API
export const travelAPI = {
  // 获取首页数据
  getHomePage: () => api.get('/travel/home'),
  // 获取景点列表
  getAttractions: (params) => api.get('/travel/attractions', { params }),
  // 获取景点详情
  getAttractionDetail: (id) => api.get(`/travel/attractions/${id}`),
  // 行为收集（兜底：前端主动上报）
  collectBehavior: ({ attractionId, behaviorType = 'view', score }) =>
    api.post('/travel/recommendation/collect', null, {
      params: { attraction_id: attractionId, behavior_type: behaviorType, score }
    }),
  
  // 订单相关API
  // 创建订单
  createOrder: (data) => api.post('/travel/orders', data),
  // 获取订单列表
  getOrders: (params) => api.get('/travel/orders', { params }),
  // 获取订单详情
  getOrderDetail: (id) => api.get(`/travel/orders/${id}`),
  // 支付订单（已废弃，请使用 createPayment）
  payOrder: (id, data) => api.post(`/travel/orders/${id}/pay`, data),
  // 创建支付（新接口）
  createPayment: (data) => api.post('/api/payment/create', data),
  // 查询支付状态
  queryPayment: (paymentNo) => api.get(`/api/payment/query/${paymentNo}`),
  // 同步订单支付状态（通过订单号）
  syncOrderPaymentStatus: (orderNo) => api.post(`/api/payment/sync/${orderNo}`),
  // 取消订单
  cancelOrder: (id) => api.post(`/travel/orders/${id}/cancel`),
  
  // 收藏相关API
  // 添加收藏
  addFavorite: (attractionId) => api.post(`/travel/favorites/${attractionId}`),
  // 取消收藏
  removeFavorite: (attractionId) => api.delete(`/travel/favorites/${attractionId}`),
  // 获取收藏列表
  getFavorites: (params) => api.get('/travel/favorites', { params }),
  // 检查是否已收藏
  checkFavorite: (attractionId) => api.get(`/travel/favorites/check/${attractionId}`),
  
  // 评价相关API
  // 创建评价
  createReview: (data) => api.post('/travel/reviews', data),
  // 获取景点评价列表
  getAttractionReviews: (attractionId, params) => api.get(`/travel/reviews/attraction/${attractionId}`, { params }),
  // 获取我的评价列表
  getMyReviews: (params) => api.get('/travel/reviews/my', { params }),
  // 删除评价
  deleteReview: (reviewId) => api.delete(`/travel/reviews/${reviewId}`)
}

// 推荐系统相关API
export const recommendationAPI = {
  // 基于用户的协同过滤
  userBased: (topN = 3) => api.get('/travel/recommendation/user-based', { params: { top_n: topN } }),
  // 基于物品的协同过滤
  itemBased: (topN = 3) => api.get('/travel/recommendation/item-based', { params: { top_n: topN } }),
  // 混合推荐
  hybrid: (topN = 3, userWeight = 0.5) =>
    api.get('/travel/recommendation/hybrid', { params: { top_n: topN, user_weight: userWeight } }),
  // 用户分层
  segment: () => api.get('/travel/recommendation/segment'),
}

// 聊天系统相关API
export const chatAPI = {
  // 获取聊天房间列表（客服端）
  getRooms: () => api.get('/api/chat/rooms'),
  // 获取待服务用户列表（客服端）
  getUsers: () => api.get('/api/chat/users'),
  // 分配客服到用户房间
  assignKefu: (roomId) => api.post(`/api/chat/assign/${roomId}`),
  // 获取历史消息
  getMessages: (roomId, limit = 50) => api.get(`/api/chat/messages/${roomId}`, { params: { limit } }),
  // 获取用户当前房间信息（用户端）
  getMyRoom: () => api.get('/api/chat/my-room'),
  // 商户聊天相关API
  // 创建或获取商户聊天房间（用户端）
  createMerchantRoom: (data) => api.post('/api/chat/merchant/create-room', data),
  // 获取商户的聊天房间列表（商户端）
  getMerchantRooms: () => api.get('/api/chat/merchant/rooms'),
  // 获取用户与商户的聊天房间列表（用户端）
  getMyMerchantRooms: () => api.get('/api/chat/merchant/my-rooms'),
  // 删除房间（仅平台客服可用）
  deleteRoom: (roomId) => api.delete(`/api/chat/room/${roomId}`)
}

// 智能问答相关API - 使用专门的qaApi实例（更长的超时时间）
export const qaAPI = {
  // 智能问答
  chat: (data) => qaApi.post('/qa/chat', data),
  // 获取对话历史
  getHistory: (userId) => qaApi.get(`/qa/history/${userId}`),
  // 新建对话
  newDialog: () => qaApi.post('/qa/new-dialog'),
  // 删除对话历史
  deleteHistory: (userId) => qaApi.delete(`/qa/history/${userId}`),
  // 获取所有对话列表
  getDialogs: () => qaApi.get('/qa/dialogs'),
  // 构建知识库
  buildKnowledgeBase: () => qaApi.post('/qa/build-knowledge-base')
}

// 扣子AI相关API
export const cozeAPI = {
  // 扣子AI流式问答（使用fetch，因为需要处理流式响应）
  chatStream: (data) => {
    const baseURL = getBaseURL()
    const token = localStorage.getItem('token')
    return fetch(`${baseURL}/coze/chat/stream`, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Authorization': token ? `Bearer ${token}` : ''
      },
      body: JSON.stringify(data)
    })
  },
  // 扣子AI非流式问答
  chat: (data) => qaApi.post('/coze/chat', data)
}

export default api

